使用镜像
Dockerfile 指令详解
COPY
:
COPY <源路径>… <目标路径>
COPY [“<源路径1>”,… “<目标路径>”]
ADD
:ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL,如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去
遵循这样一个原则: 所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD
CMD
:
shell 格式:CMD <命令>
exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…]
参数列表格式:CMD [“参数1”, “参数2”…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数
在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 “,而不要使用单引号
ENTRYPOINT
:ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 –entrypoint 来指定。
当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:< ENTRYPOINT > “< CMD >”
ENV
:
ENV < key > < value >
ENV < key1 >=< value1 > < key2 >=< value2 >…
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。可用\
换行
ARG
:ARG <参数名>[=<默认值>]
构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的
VOLUME
:
VOLUME [“<路径1>”, “<路径2>”…]
VOLUME <路径>
EXPOSE
:EXPOSE <端口1> [<端口2>…]
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射
WORKDIR
:WORKDIR <工作目录路径>
使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录
USER
:USER <用户名>
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。当然,和 WORKDIR 一样,USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换
HEALTHCHECK
:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
–interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
–timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
–retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect
来查看。
ONBUILD
:ONBUILD <其它指令>
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
其他制作镜像的方式
- 从 rootfs 压缩包导入
docker import [选项] <文件>|
|- [<仓库名>[:<标签>]] docker save
删除本地镜像
docker rmi [选项] <镜像1> [<镜像2> …]
注意
docker rm
命令是删除容器,不要混淆
操作容器
启动
- 第一种方式:基于镜像新建一个容器并启动
docker run
- 第二种方式:将在终止状态(stopped)的容器重新启动
docker start
守护态运行
-d
使 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下
要获取容器的输出信息,可以通过 docker logs
命令
终止
可以使用 docker stop
来终止一个运行中的容器
此外,当Docker容器中指定的应用终结时,容器也自动终止
进入容器
在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。
docker attach
: 使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了nsenter
:nsenter 启动一个新的shell进程(默认是/bin/bash), 同时会把这个新进程切换到和目标(target)进程相同的命名空间,这样就相当于进入了容器内部。
为了连接到容器,你还需要找到容器的第一个进程的 PID
可以$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
直接下载 .bashrc_docker,并将内容放到 .bashrc 中,就可以用
$ echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrcdocker-pid
可以获取某个容器的 PID;而 docker-enter
可以进入容器或直接在容器内执行命令。
导出和导入
导出容器:docker export
导入容器:docker import
丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态)docker load
保存所有状态
删除容器
docker stop
docker rm
建立一个 mc 服务器镜像
Kitematic 上的 Dockerfile
FROM debian:wheezy
指定基础镜像 debian,版本 wheezyRUN apt-get -y update
配置 jre 环境,因为 mc 是用 java 写的
RUN apt-get -y install openjdk-7-jre-headless wgetRUN wget -q https://s3.amazonaws.com/Minecraft.Download/versions/1.11.2/minecraft_server.1.11.2.jar
下载 mcWORKDIR /data
设置工作路径及数据卷路径
VOLUME /dataEXPOSE 25565
声明容器提供服务端口CMD echo eula=true > /data/eula.txt && java -jar /minecraft_server.1.11.2.jar
设置 eula 为 true,即同意最终用户许可协议,并且启动服务器